using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.Configuration;

namespace commonV2
{
    public class cryption
    {
        private static string currentEncryptionKey = "sBdsddw43vx,vAfdfdlSDZ3sUS2s4+-|16)(*";

        public static string myEncryptionKey
        { 
            get 
            {
                return currentEncryptionKey;
            }
            set {currentEncryptionKey = value;}
        }

        public static string Encrypt(string toEncrypt)
        {
            return Encrypt(Encrypt(toEncrypt, true), true);
        }
        public static string Decrypt(string cipherString)
        {
            return Decrypt(Decrypt(cipherString, true),true);
        }

        /// <summary>
        /// Encrypt a string using dual encryption method. Return a encrypted cipher Text
        /// </summary>
        /// <param name="toEncrypt">string to be encrypted</param>
        /// <param name="useHashing">use hashing? send to for extra secirity</param>
        /// <returns></returns>


        public static string Encrypt(string toEncrypt, bool useHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

            System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
            // Get the key from config file
            string key = myEncryptionKey;

            //System.Windows.Forms.MessageBox.Show(key);
            if (useHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                hashmd5.Clear();
            }
            else
                keyArray = UTF8Encoding.UTF8.GetBytes(key);

            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;

            ICryptoTransform cTransform = tdes.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            tdes.Clear();
            return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }
        /// <summary>
        /// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
        /// </summary>
        /// <param name="cipherString">encrypted string</param>
        /// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
        /// <returns></returns>
        public static string Decrypt(string cipherString, bool useHashing)
        {
            try
            {
                byte[] keyArray;
                byte[] toEncryptArray = Convert.FromBase64String(cipherString);

                System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
                //Get your key from config file to open the lock!
                //string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
                string key = myEncryptionKey;

                if (useHashing)
                {
                    MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                    keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
                    hashmd5.Clear();
                }
                else
                    keyArray = UTF8Encoding.UTF8.GetBytes(key);

                TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
                tdes.Key = keyArray;
                tdes.Mode = CipherMode.ECB;
                tdes.Padding = PaddingMode.PKCS7;

                ICryptoTransform cTransform = tdes.CreateDecryptor();
                byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

                tdes.Clear();
                return UTF8Encoding.UTF8.GetString(resultArray);
            }
            catch (Exception er)
            {
                errorHandler.lastException = er;
                return cipherString;
            }
        }

        public static bool CryptFile(string frFileName, string toFileName)
        {
            string value = "";
            if (!System.IO.File.Exists(frFileName)) return false;

            System.IO.StreamReader rFile = System.IO.File.OpenText(frFileName);
            System.IO.StreamWriter wFile = new System.IO.StreamWriter(toFileName);
            while (!rFile.EndOfStream)
            {
                value = cryption.Encrypt(rFile.ReadLine());
                wFile.WriteLine(value); 
            }
            rFile.Close(); wFile.Close();
            return true;
        }
        public static bool DecryptFile(string frFileName, string toFileName)
        {
            string value = "";
            if (!System.IO.File.Exists(frFileName)) return false;

            System.IO.StreamReader rFile = System.IO.File.OpenText(frFileName);
            System.IO.StreamWriter wFile = new System.IO.StreamWriter(toFileName);
            while (!rFile.EndOfStream)
            {
                value = cryption.Decrypt(rFile.ReadLine());
                wFile.WriteLine(value);
            }
            rFile.Close(); wFile.Close();
            return true;
        }
    }
}
